"""
@name : 12.元类
@author : wenyao
@projectname: xsfh
"""
# class A:
#     pass
# a1 = A()
#a1 是由A创建的
# print(type(a1))
#python中一切皆对象，类也是对象，类也是由另一个类创建的
# print(type(A))

#创建类的类称之为元类
#type 最上层的元类

# class Animal():
#     def __init__(self,name):
#         self.name = name
#
#     def eat(self):
#         print("i am eating.....")
#=========================================
# def init(self,name):
#     self.name = name
#
# def eat(self):
#     print("i am eating.....")

#第一个参数，是类名
#第二个参数是元组类型，显示继承关系
#第三个参数是一个字典，设置属性和方法
# Animal = type("Animal",(object,),{"__init__":init,"eat":eat})
# a1 = Animal("sc1")
# a1.eat()
# print(a1.name)

#元类一般用来拦截类的创建
#自定义元类
# class MyMate(type):
#     def __new__(cls, name, bases, attrs):
#         if "foo" not in attrs:
#             raise TypeError("必须设置foo属性")
#         attrs["test"]  = "mymate test"
#         return type.__new__(cls,name,bases, attrs)
# class A(metaclass=MyMate):
#     foo = "foo!"
#
# a1 = A()
# print(a1.test)
# print(type(A))

#type object
#python面向对象有两种关系
#1、继承关系  object是多有类的父类，是最顶层的类
#2、创建关系 实例与类的关系  type是最顶层的类

# print(type(object))
# print(type(type))
# print(object.__bases__)
# print(type.__bases__)
# object = type(object)

#相当于一种蛋生鸡 鸡生蛋的关系 先有鸡还是先有蛋